package com.catmiao.sql;


import org.apache.spark.sql.*;

public class Spark09_udaf {

    public static void main(String[] args) {

        // 构建SparkSQL的环境对象时，一般采用构建器模式
        // 构造器模式：构建对象
        SparkSession sparkSession = SparkSession
                .builder()
                .master("local[*]")
                .appName("SparkSQL")
                .getOrCreate();


        // TODO Spark SQL中对数据模型也进行封装：RDD -> Dataset
        //      对接文件数据源时，会将文件中的一行数据封装为 Row对象
        Dataset<Row> ds = sparkSession.read().json("datas/sql/user.json");

        ds.createOrReplaceTempView("user");

        sparkSession.sql("select concat('Name:',username) from user").show();



        // TODO SparkSQL采用特殊的方式将UDAF转成UDF使用
        //      UDAF使用时需要自定义聚合对象 param1:聚合对象 param2：输入的类型Encodor
        sparkSession.udf().register("avgAge", functions.udaf(
                new MyAvgAgeUDAF(),Encoders.LONG()
        ));

        sparkSession.sql("select avgAge(age) from user").show();


        sparkSession.close();
    }

}
